package cn.tedu.knows.portal.controller;

import cn.tedu.knows.portal.exception.ServiceException;
import cn.tedu.knows.portal.service.IUserService;
import cn.tedu.knows.portal.vo.RegisterVo;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@RestController
@Slf4j
public class SystemController {

    //Ctrl+Alt+B可以直接跳转到这个接口的实现类
    @Autowired
    private IUserService userService;

    @PostMapping("/register")
    //@Validated表示激活紧随其后的类型的SpringValidation验证
    //要验证的对象参数后面新增一个参数类型为BindingResult
    //SpringValidation会将验证结果自动赋值到这个对象中
    public String registerStudent(
            @Validated RegisterVo registerVo,
            BindingResult result) {
        //第二个参数registerVo会自动赋值到第一个参数中的{}的位置
        log.debug("获得用户填写的信息:{}", registerVo);
        //判断result对象中有没有错误
        if (result.hasErrors()) {
            //如果有错误,进入if语句处理
            //获得错误消息
            String msg = result.getFieldError()
                    .getDefaultMessage();
            return msg;
        }
        //执行注册
        userService.registerStudent(registerVo);
        return "注册成功";
    }

    //@PostMapping("/upload/image")
    public String uploadImage(MultipartFile imageFile)
            throws IOException {
        //参数有名称必须和form.append方法中的第一个参数名称一致
        //确定文件夹
        File folder=new File("F:/upload");
        //如果文件夹不存在要创建出来
        //   注意是mkdirsssssssssssss!!!!!
        folder.mkdirs();
        //获得原始文件名
        String fileName=imageFile.getOriginalFilename();
        //确定上传文件的位置
        // F:/upload/abc.jpg
        File file=new File(folder,fileName);
        //执行上传
        imageFile.transferTo(file);
        return "Done";
    }

    //获得配置文件中配置的信息
    @Value("${knows.resource.path}")
    //resourcePath的值就来自上面配置指定的值
    private File resourcePath;

    @Value("${knows.resource.host}")
    private String resourceHost;


    @PostMapping("/upload/image")
    public String uploadFile(MultipartFile imageFile) throws IOException {
        //使用日期划分文件夹
        //yyyy是年的占位符 MM是月占位符 dd是日
        String path= DateTimeFormatter
                .ofPattern("yyyy/MM/dd")
                .format(LocalDate.now());
        //path:"2021/06/02"
        //创建文件夹(F:/upload/2021/06/02)
        File folder=new File(resourcePath,path);
        folder.mkdirs();

        //获得文件名
        String fileName=imageFile.getOriginalFilename();
        //获取后缀名
        //a.bc.png
        //01234567
        String ext= fileName.substring(
                    fileName.lastIndexOf("."));
        //随机生成文件名
        String name= UUID.randomUUID().toString()+ext;
        //确定上传文件
        //F:/upload/2021/06/02/adshasfajsdhf.png
        File file=new File(folder,name);

        imageFile.transferTo(file);

        //拼接一个可以访问静态资源服务器图片的路径
        //目的是访问刚刚上传成功的图片,显示在页面上
        //http://localhost:8899/2021/06/02/687dd63.jpg
        String url=resourceHost+"/"+path+"/"+name;
        log.debug("访问路径为:{}",url);
        //返回url!!!!!
        return url;
    }








}
